package com.ustb.service.impl;

import com.ustb.service.CameraCaptureService;
import org.bytedeco.javacv.Frame;
// 导入OpenCVFrameConverter类，用于在JavaCV的Frame和OpenCV的Mat之间进行转换
import org.bytedeco.javacv.OpenCVFrameConverter;
import org.bytedeco.javacv.OpenCVFrameGrabber;
import org.bytedeco.opencv.global.opencv_imgcodecs;
// 导入Mat类，是OpenCV库中用于表示图像矩阵的数据结构
import org.bytedeco.opencv.opencv_core.Mat;
import org.springframework.stereotype.Service;

@Service
public class CameraCaptureServiceImpl implements CameraCaptureService {

    // 实现CameraCaptureService接口中的captureFrames方法，用于捕获摄像头的帧
    @Override
    public Mat captureFrames() throws Exception {
        // 创建一个OpenCVFrameGrabber对象，参数0表示默认使用第一个摄像头设备作为视频源
        OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
        // 启动视频帧抓取器，使其准备好从摄像头获取视频帧
        grabber.start();

        // 用于记录已经抓取并处理的帧的数量
        int frameCount = 0;
        // 创建一个OpenCVFrameConverter的ToMat类型的转换器，用于将Frame转换为Mat
        OpenCVFrameConverter.ToMat converter = new OpenCVFrameConverter.ToMat();

        // 进入一个无限循环，不断尝试从摄像头抓取视频帧
        while (true) {
            // 从摄像头抓取一帧视频帧，如果抓取成功则返回一个Frame对象，否则返回null
            Frame frame = grabber.grab();
            // 如果抓取到的帧不为空，说明成功获取到了一帧视频帧
            if (frame!= null) {
                // 使用转换器将抓取到的Frame对象转换为Mat对象，Mat是OpenCV中用于表示图像矩阵的数据结构
                Mat mat = converter.convert(frame);
                // 将捕获到的图像帧以JPEG格式保存到本地文件，文件名根据帧的计数生成
                opencv_imgcodecs.imwrite("captured_frame_" + frameCount + ".jpg", mat);
                // 帧计数加1
                frameCount++;
                // 返回当前捕获到的Mat对象，即当前捕获到的视频帧对应的图像矩阵
                return mat;
            }
        }
    }
}